路由基础

在构建Web应用时,路由(Routing)是一个核心概念。它决定了当用户访问某个URL时,服务器应该如何响应。Express.js 是一个流行的Node.js框架,它简化了路由的实现。本教程将带你深入了解Express.js中的路由基础。

1. 什么是路由?

路由是指根据HTTP请求的URL和方法(如GET、POST等)来决定服务器应该执行哪些操作。简单来说,路由就是定义URL与处理函数之间的映射关系。

1.1 路由的基本结构

在Express.js中,路由通常由以下几个部分组成:

  • HTTP方法:如GET、POST、PUT、DELETE等。
  • 路径:URL路径,可以是静态路径或动态路径。
  • 处理函数:当请求匹配时,执行的函数。

1.2 示例代码

const express = require('express');
const app = express();

// 定义一个GET请求的路由
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 定义一个POST请求的路由
app.post('/submit', (req, res) => {
  res.send('Data submitted successfully!');
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

在这个例子中,我们定义了两个路由:

  • GET /:当用户访问根路径时,服务器会返回“Hello World!”。
  • POST /submit:当用户提交数据到/submit路径时,服务器会返回“Data submitted successfully!”。

2. 路由路径

路由路径可以是静态的,也可以是动态的。动态路径允许你从URL中提取参数。

2.1 静态路径

静态路径是指路径中没有变量,完全由固定的字符串组成。

app.get('/about', (req, res) => {
  res.send('This is the about page.');
});

2.2 动态路径

动态路径允许你在路径中使用变量,这些变量可以从URL中提取出来。

app.get('/user/:id', (req, res) => {
  res.send(`User ID: ${req.params.id}`);
});

在这个例子中,:id是一个动态参数,可以通过req.params.id获取。

3. 路由方法

Express.js支持多种HTTP方法,包括GET、POST、PUT、DELETE等。你可以根据需要定义不同的路由方法。

3.1 GET方法

GET方法用于从服务器获取数据。

app.get('/data', (req, res) => {
  res.send('Here is your data.');
});

3.2 POST方法

POST方法用于向服务器提交数据。

app.post('/data', (req, res) => {
  res.send('Data received.');
});

3.3 PUT方法

PUT方法用于更新服务器上的资源。

app.put('/data/:id', (req, res) => {
  res.send(`Data with ID ${req.params.id} updated.`);
});

3.4 DELETE方法

DELETE方法用于删除服务器上的资源。

app.delete('/data/:id', (req, res) => {
  res.send(`Data with ID ${req.params.id} deleted.`);
});

4. 路由处理函数

路由处理函数是当请求匹配时执行的函数。它通常接受两个参数:req(请求对象)和res(响应对象)。

4.1 请求对象 (req)

请求对象包含客户端发送的所有信息,如URL、请求头、请求体等。

app.get('/info', (req, res) => {
  console.log(req.headers); // 打印请求头
  console.log(req.query);   // 打印查询字符串
  res.send('Info received.');
});

4.2 响应对象 (res)

响应对象用于向客户端发送响应。你可以使用res.send()、res.json()、res.status()等方法来控制响应。

app.get('/status', (req, res) => {
  res.status(200).send('OK');
});

5. 实践练习

5.1 创建一个简单的博客应用

在这个练习中,我们将创建一个简单的博客应用,包含以下功能:

  • 显示博客列表 (GET /blogs)
  • 显示单篇博客 (GET /blogs/:id)
  • 创建新博客 (POST /blogs)
const express = require('express');
const app = express();

let blogs = [
  { id: 1, title: 'First Blog', content: 'This is the first blog.' },
  { id: 2, title: 'Second Blog', content: 'This is the second blog.' }
];

app.use(express.json()); // 解析JSON请求体

// 显示博客列表
app.get('/blogs', (req, res) => {
  res.json(blogs);
});

// 显示单篇博客
app.get('/blogs/:id', (req, res) => {
  const blog = blogs.find(b => b.id === parseInt(req.params.id));
  if (!blog) return res.status(404).send('Blog not found.');
  res.json(blog);
});

// 创建新博客
app.post('/blogs', (req, res) => {
  const newBlog = {
    id: blogs.length + 1,
    title: req.body.title,
    content: req.body.content
  };
  blogs.push(newBlog);
  res.status(201).json(newBlog);
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

5.2 运行和测试

  1. 启动服务器:在终端中运行 node app.js。
  2. 使用Postman或curl测试API:
    • 获取博客列表:GET http://localhost:3000/blogs
    • 获取单篇博客:GET http://localhost:3000/blogs/1
    • 创建新博客:POST http://localhost:3000/blogs,请求体为JSON格式,例如:
      {
        "title": "New Blog",
        "content": "This is a new blog."
      }
      

6. 总结

通过本教程,你已经掌握了Express.js中路由的基础知识。你学会了如何定义静态和动态路由,如何处理不同的HTTP方法,以及如何使用请求和响应对象。接下来,你可以继续学习更高级的路由功能,如路由参数、查询字符串处理等。

在下一节中,我们将深入探讨Express.js中的中间件概念,它将帮助你更好地组织和扩展你的应用。